package PhaseoneModuletwo.TheSecondQuestion.code;

import java.util.Scanner;

/**
 * 编程实现控制台版并支持两人对战的五子棋游戏。
 * （1）绘制棋盘 - 写一个成员方法实现
 * （2）提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
 * （3）每当一方下棋后判断是否获胜 - 写一个成员方法实现。
 * （4）提示： 采用二维数组来模拟并描述棋盘，棋盘如下：
 */
public class GoBang {
    //定义一个长度为[17][17]二维数组
    char[][] arr = new char[17][17];
    //定义一个扫描器获取双方落子的位置
    Scanner sc = new Scanner(System.in);
    boolean b = true;

    //绘制棋盘
    public void checkerBoard() {
        //循环给棋盘赋值
        for (int i = 1; i < arr.length; i++) {
            for (int j = 1; j < arr[i].length; j++) {
                arr[i][j] = '+';
            }
        }

        //循环给第一行和第一列赋值
        for (int i = 1; i <= 10; i++) {
            arr[0][i] = (char) (47 + i);
            arr[i][0] = (char) (47 + i);
        }
        for (int i = 11; i < arr[0].length; i++) {
            arr[0][i] = (char) (86 + i);
            arr[i][0] = (char) (86 + i);
        }
    }

    //根据双方落子位置重新绘制棋盘
    public void checkerBoardAgain() {
//        定义两个变量接收落子的横纵坐标
        int row = 0;
        int column = 0;

        checkerBoard();
//        用死循环来实现双方拼杀，直至一方胜利
        gobang:
        for (; ; ) {
//          到达胜利之前，无法回头
            while (b) {
//          接收Emma导师落子位置信息
                System.out.println("Emma导师请落棋（输入落子的坐标）");
                row = sc.nextInt();
                column = sc.nextInt();

//          判断落子的位置是否合理
                if (row < 1 || column < 1 || row > 16 || column > 16) {
                    System.out.println("落子的位置不合理哦");
                    continue;
//          判断该位置是否有棋子
                } else if ("黑".equals(String.valueOf(arr[row][column])) || "白".equals(String.valueOf(arr[row][column]))) {
                    System.out.println("该位置已经有棋子了");
                } else {
                    //落黑棋
                    arr[row][column] = '黑';
                    //每落一子就打印棋盘
                    for (int i = 0; i < arr.length; i++) {
                        for (int j = 0; j < arr[i].length; j++) {
                            System.out.print(arr[i][j] + "\t");
                        }
                        System.out.println();
                    }

                    b = whetherWin(row, column);
                    //判断五子或大于五子连线，结束循环，黑方获胜
                    if (b == false) {
                        System.out.println("恭喜Emma导师获胜！！！");
//                      结束外层循环，游戏结束
                        break gobang;
                    }
//                    结束当前循环
                    break;
                }
            }
//          到达胜利之前无法回头
            while (b) {
//          接收奇点讲师落子位置信息
                System.out.println("奇点讲师请落棋（输入落子的坐标）");
                row = sc.nextInt();
                column = sc.nextInt();


//          判断落子的位置是否合理
                if (row < 1 || column < 1 || row > 16 || column > 16) {
                    System.out.println("落子的位置不合理哦");
                    continue;
//          判断该位置是否有棋子
                } else if ("黑".equals(String.valueOf(arr[row][column])) || "白".equals(String.valueOf(arr[row][column]))) {
                    System.out.println("该位置已经有棋子了");
                } else {
//                落白棋
                    arr[row][column] = '白';
                    //每落一子就打印棋盘
                    for (int i = 0; i < arr.length; i++) {
                        for (int j = 0; j < arr[i].length; j++) {
                            System.out.print(arr[i][j] + "\t");
                        }
                        System.out.println();
                    }
                    b = whetherWin(row, column);
//          判断五子或大于五子连线，循环结束，白方获胜
                    if (b == false) {
                        System.out.println("恭喜奇点老师获胜！！！");
//                  结束外层循环，游戏结束
                        break gobang;
                    }
//                  结束当前循环
                    break;
                }

            }
        }
    }

    //  写一个判断落子位置是否合理和判断是否获胜的方法
    public boolean whetherWin(int row, int column) {
        //定义接收左边、右边、上边、下边、左上、左下、右上、右下分别有多少个连续的棋子的变量
        int leftSum = 0;
        int rightSum = 0;
        int upSum = 0;
        int downSum = 0;
        int leftUpSum = 0;
        int leftDownSum = 0;
        int rightUpSum = 0;
        int rightDownSum = 0;

        //判断左边有多少个连续的棋子
        for (int i = 1; i < column; i++) {
            if (arr[row][column] == arr[row][column - i]) {
                leftSum++;
            } else {
                break;
            }
        }
        //判断右边有多少个连续的棋子
        for (int i = 1; column + i < arr.length; i++) {
            if (arr[row][column] == arr[row][column + i]) {
                rightSum++;
            } else {
                break;
            }
        }
        //判断上边有多少个连续的棋子
        for (int i = 1; i < row; i++) {
            if (arr[row][column] == arr[row - i][column]) {
                upSum++;
            } else {
                break;
            }
        }
        //判断下边有多少个连续的棋子
        for (int i = 1; row + i < arr.length; i++) {
            if (arr[row][column] == arr[row + i][column]) {
                downSum++;
            } else {
                break;
            }
        }
        //判断左上有多少个连续的棋子
        for (int i = 1; row - i > 0 && column - i > 0; i++) {
            if (arr[row][column] == arr[row - i][column - i]) {
                leftUpSum++;
            } else {
                break;
            }
        }
        //判断右下有多少个连续的棋子
        for (int i = 1; row + i < arr.length && column + i < arr.length; i++) {
            if (arr[row][column] == arr[row + i][column + i]) {
                rightDownSum++;
            } else {
                break;
            }
        }
        //判断左下有多少个连续的棋子
        for (int i = 1; row + i < arr.length && column - i > 0; i++) {
            if (arr[row][column] == arr[row + i][column - i]) {
                leftDownSum++;
            } else {
                break;
            }
        }
        //判断右上有多少个连续的棋子
        for (int i = 1; row - i > 0 && column + i < arr.length; i++) {
            if (arr[row][column] == arr[row - i][column + i]) {
                rightUpSum++;
            } else {
                break;
            }
        }
        //判断是否五子连线，返回false
        if (leftSum + rightSum >= 4 || upSum + downSum >= 4 || leftUpSum + rightDownSum >= 4 || leftDownSum + rightUpSum >= 4) {
            b = false;
        }
        return b;
    }

    public static void main(String[] args) {
        GoBang gb = new GoBang();
        gb.checkerBoardAgain();
    }
}